There are many different types of software developers out there. Some are generalists, while other are more specialized. And the distinction in specialism is not only between application types, such as web vs native.
Even in the same type of app, there are programmers who can build the whole thing and there are the ones whose expertise is only limited to one part of it, such as user interface.
This distinction is particularly prominent in the world of web apps. There are those who only ever do the front-end. There are those who don’t touch anything other than the back-end. There are those who are experts in databases that wouldn’t do anything else. And there are also full-stack developers, who are seen as the ones who would be able to tackle all these parts of the software.
However, many people wonder if there is even such thing as a full-stack developer. Technology moves forward at a fast pace; therefore even being a specialist is hard. In the web front-end alone, new libraries and frameworks get released at an incredibly fast rate.
So, even in that narrow domain, keeping up with all of the changes is incredibly difficult. So how can somebody keep themselves up to date with front-end technologies while, at the same time, keep up with the developments in back-end and databases?
The truth is, however, that full stack developers do exist. And they are neither geniuses nor mediocre programmers who have a superficial knowledge of many technologies, but aren’t masters in any. Perhaps, some do fall into either of these categories, but this is not how the things are overall.
Full stack developers know all fundamentals
So, what makes one a full stack developer? Primarily, it is the knowledge of all fundamentals of the core technologies that each layer of the application stack consists of. This includes the knowledge of the best practices for each of the layers. So, if a particular stack uses relational database as the data storage layer, a full stack developer will not merely know basic SQL syntax, but will also know how to index tables and normalize the data structure.
At the same time, the same developer will be competent with the back-end code that lays between the data and the user interface. So, for example, if such code is written in C#, the developer will not merely know how to code in this language, but will also be aware of the difference between managed and unmanaged resources, reference and value types, conditional compilation, garbage collection, etc..
When it comes to the front-end, the same developer will be competent enough to be able to build a professional web pages. They will have a good knowledge of HTML, CSS, JavaScript and some of the popular front-end frameworks and libraries, such as Angular.
As well as the above, a full stack developer will know enough about the server software that hosts the web application. Perhaps, they wouldn’t have a very detailed knowledge of it, but would still know enough to be able to run and diagnose the applications.
Finally, a full stack developer will be aware of the best security practices. Therefore, the app that they would build would not be vulnerable to common attacks, such as SQL Injection and Cross-site scripting. Likewise, user passwords for such an app are very unlikely to be stored as plain text.
However, breadth of knowledge comes at the expense of depth. Therefore, although a full stack developer is fully capable of building a fully functional professional apps, there are certain scenarios where advanced specialist skills would be more beneficial.
For example, it is unlikely that a full stack developer would know as much about databases as a DBA would do. For databases that are designed to store relatively small volumes of data, this would not be an issue. However, when there are millions, or even billions, of records, someone with very detailed database knowledge would be needed to ensure that the performance remains at acceptable level.
Likewise, although a full stack developer would be capable of building a professional-looking front-end, there are scenarios where extra creative user interfaces with some advanced animations are required. A specialist front-end developers are much more suited for such task.
Some degree of specialization is always needed
While the breadth of knowledge is important for full stack developers, they still are specialists to a degree. This is because there are many stacks to choose from. There is LAMP, there is MEAN and there are several different flavours of ASP.NET, among many others. A successful full stack developer is someone who, rather than knowing many of these stacks, knows one of them well.
It is impossible to be a successful software developer while also being a very broad generalist. John Sonmez emphasizes this point very well in his book, “The Complete Software Developer’s Career Guide”:
Think of it this way: suppose you wanted to be an “athlete.”
That is pretty dang broad. How should you train to be an “athlete?”
Maybe you should lift weights and run, but maybe you should practice swimming. Maybe you should hit a ball with a tennis racket.
Better do all those things and more, so you are prepared for any sport that you might end up getting on a team to play.
See how ridiculous that sounds?
That is how ridiculous—in fact even more so—it sounds when someone expects to be a “software developer.”
Instead, pick your sport.
Nobody does full stack work all the time
While a full stack developer is someone who knows the whole of a particular technology stack reasonably well, it doesn’t mean that they work on all layers of the stack all the time.
Whether they will be working on the whole app or only a relatively small part of it, depends on how big is the organisation where they work and how big is the app that is being developed.
Small start-ups have to be able to build software as quickly as possible by as few developers as possible. Therefore, this is an environment where full stack skills are most likely to be utilized to the full. This is where each developer is likely to be responsible for an entire app or a whole major feature of the software ecosystem.
Medium-sized companies are likely to have individual teams responsible for individual apps. However, it is still very likely that, at any given time, each member of the development team will be working on more than one layer of an application.
For example, for one person, it may be the front-end and the part of the back-end that is attached to it. For another person, it could be the data storage and the part of the back-end that manages the data. This is where full stack skills are still beneficial, but each person is unlikely to be able to utilize them all in the same project.
Finally, large organisations, such as Amazon, are likely to build very large and complex applications; therefore it would be impossible for any one developer to be familiar with the whole system. This is why such organisations tend to have a dedicated team responsible for a single feature, each of which usually lays within a single layer of stack. As a developer working in such organisation, you are not only unlikely to work on multiple layers of stack, but are unlikely to work on any single application layer in its entirety.
Of course, the size of the software is more reliable indicator of whether full stack skills are likely to be used. Large organisation sometimes also build small apps. Consultancy firms such as CGI, for example, run a large number of relatively small bespoke projects at any one time.
In this scenario, each project team operates as an independent software house. However, more often than not, the size and complexity of the software correlates to the size of the organisation that is building it.
However, even for developers who work in medium and large organisations, it pays to have knowledge of more than one technology components. If you are not utilizing some of your skills in the current project, it doesn’t mean that you won’t be able to utilize those skills in your next project. All it means is that there is a limited set of skills that can be utilized by a particular person at any one time.
Therefore, even in an environment where specialization is encouraged, as a full stack developer you would have better choices of projects than you would have had as a specialist However, as the size of the software that you work on increases, specialization becomes something that is enforced rather than merely encouraged. Therefore, if you join an organisation where specialization is crucial, you are likely to become a specialist in a narrow area over time, even if you used to be a full stack developer.
You don’t have to know it all
you have probably heard that, in order to be successful as a software developer, you need to keep learning new technologies all the time. This is, technically, true. However, many programmers, especially the junior ones, misunderstand what this means.
New programming languages and other technologies get released all the time. For JavaScript alone, there are literally thousands of different frameworks, libraries and toolkits on the market. Because of this, programmers often feel overwhelmed.
The good news is, however, that you don’t have to learn it all. Yes, it is true that there are way too many JavaScript frameworks out there for any single person to learn. However, only few of them stand the test of time. For example, in 2014, people were talking Angular and so they do in 2018. This is why you don’t necessarily have to be an early adopter of every “hot” new framework.
Of course, Angular has evolved over the years. However, for someone who has learned the first version of it and continued using it, the changes that had to be learned were incremental and gradual.
Also, those frameworks that do stand the test of time seem to be very similar to each other. Anyone who knows KnockoutJS can easily transition to Angular or Aurelia. Therefore, to be a competent JavaScript developer, all you need to do is have a thorough knowledge of one or two frameworks and a couple of specialist libraries, such as Moment.js for time processing. That alone is sufficient to solve any problem that JavaScript can solve.
In fact, if you already have a thorough knowledge of any particular JavaScript framework, there are, pretty much, only two reasons why you should learn any other one. The first one is that your framework of choice doesn’t happen to solve a particular problem in the best way possible. To find out whether it is the case, you don’t have to do much. Just subscribe to a good web-based magazine related to front-end development. Anything that is great at solving specific types of problems is ought to be mentioned there.
The second scenario where you will need to learn a new framework is when you move to a project where a particular framework that is different from what you already know is being used. However, as I said before, it will probably not be a very steep learning curve.
Also, as long as you have gained a good fundamental knowledge of certain technologies, you don’t necessarily have to keep up with them all the time. Imagine the following scenario: you have started on a project where version 5 of C# was used. After you’ve built the software, you’ve transitioned into maintaining it. The long-term plan is to eventually get the app decommissioned; therefore there was never any need to update the version of the language in it.
While your primary role was to maintain the software, version 6 and then 7 of C# were released. However, you had no time to keep up with the changes. So, what would happen if you are to quit your current project and join one where the latest version of the language is used?
Well, nothing catastrophic will occur. If you already familiar with most C# features up to version 5, learning a handful of features that were introduced in two most recent versions will probably take you no more than a day. Therefore, you will still be absolutely fine.
So, this is how it is possible to be a full stack developer and stay relevant while new technologies keep popping up. You don’t have to learn it all. You only need to keep up with those technologies that are relevant to your domain.
It is now easier to be a full stack developer than ever
Another good news is that programming technologies tend to evolve in such a way that transitioning between different layers of application stack becomes easier.
One of the most recent technology stacks, MEAN (which stands for MongoDB, Express.js, Angular and Node.js) uses JavaScript as the main programming language all the way through. Not only the language runs in the front-end as well as the back-end, but even data manipulation is done in the same way as you would normally call a method in JavaScript. The data itself is stored in JSON, which is a native data structure format for JavaScript.
However, even if you don’t pick up MEAN and stick to a different stack, you would still find your job as a full stack developer easier than you would have done a couple of years ago. For example, it used to be necessary to write JavaScript code differently from how you would write code in compilable language, such as C#.
Although JavaScript syntax loosely resembles a syntax of C-family languages, such as Java and C#, the language was not designed to be modular. Therefore, it was necessary to have large files where having access to shared data or functions was necessary.
Likewise, JavaScript variables are dynamic, which implies that completely different types of data can be assigned to the same variable without throwing any syntax errors. This language features used to catch some developers off guard, especially the ones who were used to strongly-typed languages.
However, since Node.js became popular, many tools became available for JavaScript to make it easier to use. For example, JavaScript application can now be developed in a modular manner that resembles a pure object oriented language. Likewise, supersets of JavaScript, such as TypeScript, made it possible to have the code strongly typed.
With both of these features enabled, writing JavaScript code became very similar to writing a C# code. And the same IDE can be used for both. Of course, the JavaScript that actually runs in the front-end of your app is neither modular not strongly typed. However, neither it is the JavaScript you have to manually write. Your modular and strongly typed code will get transpiled into pure JavaScript, just like your C# code is compiled into executable binaries.
Conclusion
So, as you can see, being a full stack software developer is far from being impossible. Certain amount of learning is required, but probably not as much as some junior developers think.
“Full stack” part primarily refers to what your capabilities are and not what you do as a job on regular basis. Keeping up with new technologies is important, but you will only need to focus on the ones relevant to your chosen domain.
One advantage of being a full stack developer is that you will have more choice in terms of choosing your project. Therefore, if you are someone who likes programming, but gets bored easily, becoming a full stack developer is a wise career choice.